Introduce support for MSC4429: Profile Updates for Legacy Sync#19556
Introduce support for MSC4429: Profile Updates for Legacy Sync#19556anoadragon453 wants to merge 141 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
Implements experimental MSC4429 support by introducing a new profile_updates stream (persisted + replicated) and surfacing profile field changes in legacy /sync when enabled.
Changes:
- Add
profile_updatesstream tracking (DB schema, stream token field, notifier + replication stream plumbing). - Emit MSC4429 profile updates in
/syncresponses and add filter support for selecting profile fields. - Record profile field updates on profile mutations (set/unset displayname/avatar/custom fields, deactivation cleanup).
Reviewed changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/rest/client/test_rooms.py | Updates hardcoded stream tokens to match the new StreamToken shape. |
| tests/rest/admin/test_room.py | Updates hardcoded stream tokens to match the new StreamToken shape. |
| synapse/types/init.py | Adds PROFILE_UPDATES stream key and extends StreamToken serialization/parsing. |
| synapse/streams/events.py | Includes profile_updates_key in current/bounded stream tokens. |
| synapse/storage/schema/main/delta/94/01_profile_updates_seq.sql.postgres | Adds Postgres sequence for the new stream. |
| synapse/storage/schema/main/delta/94/01_profile_updates.sql | Adds profile_updates table + indexes. |
| synapse/storage/schema/init.py | Bumps schema version to 94 and documents the change. |
| synapse/storage/databases/main/profile.py | Adds profile update persistence/query APIs and stream ID generator wiring. |
| synapse/rest/client/versions.py | Advertises org.matrix.msc4429 in unstable_features. |
| synapse/rest/client/sync.py | Encodes MSC4429 profile update payload into /sync response. |
| synapse/replication/tcp/streams/_base.py | Adds ProfileUpdatesStream replication stream. |
| synapse/replication/tcp/streams/init.py | Registers ProfileUpdatesStream for replication. |
| synapse/replication/tcp/handler.py | Replicates ProfileUpdatesStream from configured writers. |
| synapse/replication/tcp/client.py | Handles incoming profile update replication and notifies listeners. |
| synapse/notifier.py | Allows StreamKeyType.PROFILE_UPDATES to wake /sync waiters. |
| synapse/handlers/sync.py | Generates initial + incremental MSC4429 profile update sections in /sync. |
| synapse/handlers/profile.py | Records profile update markers on profile mutations and notifies. |
| synapse/config/experimental.py | Adds msc4429_enabled config flag. |
| synapse/api/filtering.py | Adds /sync filter support for selecting profile fields (MSC4429-gated). |
| docker/complement/conf/workers-shared-extra.yaml.j2 | Enables MSC4429 in complement worker test config. |
| changelog.d/19556.feature | Adds changelog entry for MSC4429 experimental support. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
83e699f to
a846945
Compare
dc8e9f8 to
a309372
Compare
We create a stream table dedicated to tracking profile updates. The sync machinary can this stream to understand whether a profile update needs to be included in a client's sync response.
Add a new stream type for profile updates. This allows sync processes to determine which profile updates a given user has or hasn't seen yet.
Replicate changes to the profile updates stream so that sync workers know there's a new profile update, and wake up sync waiters accordingly. Updates are keyed by `room_id` - sync waiters should only wake up if a user they share a room with updates their profile.
Based on the provided since token and filter.
And update relevant documentation/integration test config.
Prevent the `ProfileRestServlet` from handling requests intended for the `ProfileFieldRestServlet`. If a requester tried to call PUT `.../profile/@user:domain/(key_id?)` a worker that did not mount `ProfileFieldRestServlet`, they would then receive a `405 Method Not Allowed` instead of the expected `404 Not Found`.
a309372 to
f27ca70
Compare
… leave Regardless of action. This is cleaner and also ensures a join/leave/join/leave case might not get confused.
…oined profile updates rows, due to membership event changes
To make CI happier, even though we just want to compare content has changed.
Extracted to a follow-up pr. This reverts commit b657d2f
Setting a profile field (including displayname / avatar_uri) now needs to happen on a profile updates stream writer. There are new "dispatch" methods to do the profile field set/delete, that handle pushing the update over replication, if required. Profile field updates and profile updates stream writes are now in the same database transaction.
…ds, to update the profile updates stream
…ile fields, to update the profile updates stream" This reverts commit 1937e76.
I changed things so deactivation did call these and no tests failed.
We now do all the actions relating to the stream updates in one transaction. Additionally ensure we wake up the notifier for the users concerned.
…rofile updates stream updates in a single transaction
…e right instance, if necessary
# Conflicts: # synapse/rest/client/versions.py
Since c63d77a moved things
…e not in any rooms
Thanks sytest 🤩
|
I think this is ready for another round of review 🙏 A big thanks @reivilibre for all the detail in the previous reviews. There is one unresolved comment: #19556 (comment) - I'm unsure what is the right way to go here, but have suggested my favourite option I could come up with. |
Replication path arguments need to be strings.
Since we moved a lot of stuff to happen in the profile update stream writers, we need to always have the replication endpoints enabled now.
This PR implements support for MSC4429: Profile Updates for Legacy Sync.
Recommended to review commit-by-commit.Commit history has become messy, suggest reviewing as a single item.Paired with matrix-org/complement#849 and branch https://github.com/matrix-org/sytest/tree/anoa/msc4429
Tracking issue for removing unstable identifiers in Synapse: #19891
Pull Request Checklist
EventStoretoEventWorkerStore.".code blocks.